// 声明当前文件所在的包路径
package com.jr.mapper;

// 导入所需的类
import com.jr.pojo.PUser;
import com.jr.pojo.Program; // 导入项目实体类
import com.jr.pojo.User;
import org.apache.ibatis.annotations.Param; // MyBatis的参数注解，用于给参数命名
import org.apache.ibatis.annotations.Select; // MyBatis的查询注解，用于编写SQL查询语句
import org.apache.ibatis.annotations.Update; // MyBatis的更新注解，用于编写SQL更新语句
import org.springframework.stereotype.Component; // Spring的组件注解，标识这是一个Spring管理的组件

import java.util.ArrayList; // 导入ArrayList集合类

// @Component注解：标识这个接口是一个Spring组件，会被Spring容器扫描和管理
@Component
// 定义ProgramMapper接口，用于数据库操作
public interface ProgramMapper {

    // @Select注解：定义查询SQL语句，MyBatis会自动实现这个方法
    // 根据用户名和密码查询用户信息
    @Select("select * from users where username=#{username} and password=#{password}")
    // 方法定义：通过PUser对象查询用户，返回PUser对象
    // #{usercode}和#{password}是MyBatis的参数占位符，会自动从PUser对象中获取对应属性值
    User selectByUser(User user);

    // 分页查询项目信息（需要对应的XML文件实现SQL）
    // 使用@Param注解给参数命名，在XML中可以通过这些名称引用参数
   /* ArrayList<Program> selectByProgram(@Param("program") Program program, // 项目查询条件对象
                                       @Param("pageIndex") Integer PageIndex, // 页码（从0开始）
                                       @Param("showNum") Integer ShowNum); // 每页显示数量
*/
    // 查询所有项目信息（需要对应的XML文件实现SQL）
    // 根据条件查询所有符合条件的项目，返回ArrayList集合
    /*ArrayList<Program> selectAll(@Param("program") Program program); // 项目查询条件对象
*/
    // @Update注解：定义更新SQL语句
    // 更新项目状态
  //  @Update("update projectinfo set status=#{status} where pid=#{pid}")
    // 方法定义：更新项目状态，返回受影响的行数
    // #{status}和#{pid}从Program对象中获取对应的属性值
  //  int updateStatus(Program p);

}
/*注解方式 vs XML方式：
使用 @Select、@Update 注解的方法：SQL直接写在注解中，MyBatis会自动实现
没有注解的方法：需要在 ProgramMapper.xml 文件中编写对应的SQL语句
@Param 注解的作用：
给方法参数命名，在XML中可以通过 #{参数名} 引用
例如：#{program.name}、#{pageIndex}、#{showNum}
返回值类型：
PUser：返回单个对象（查询单条记录）
ArrayList<Program>：返回对象集合（查询多条记录）
int：返回受影响的行数（更新操作）
方法命名规范：
selectByPUser：根据用户条件查询
selectByProgram：根据项目条件查询（分页）
selectAll：查询所有
updateStatus：更新状态*/